﻿using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Text;

namespace BCService.Common.Payment.Payment.AliPayModel
{
    /// <summary>
    /// 支付宝请求参数的集合
    /// </summary>
    public class AlipayBizContent:IAlipayBizContent
    {
        protected readonly JsonSerializerSettings jsonSerializerSettings;

        public AlipayBizContent()
        {
            jsonSerializerSettings = new JsonSerializerSettings
            {
                ContractResolver = new DefaultContractResolver
                {
                    NamingStrategy = new SnakeCaseNamingStrategy()
                },
                NullValueHandling = NullValueHandling.Ignore
            };
        }

        public string Serialize()
        {
            return JsonConvert.SerializeObject(this, jsonSerializerSettings);
        }

        /// <summary>
        /// 手机App支付：是/扫码支付：是/退款：否
        /// 256
        /// 商品的标题/交易标题/订单标题/订单关键字等。
        /// </summary> 
        public string Subject { get; set; }

        /// <summary>
        /// 手机App支付：是/扫码支付：是/退款：是
        /// 64
        /// 商户网站唯一订单号
        /// </summary> 
        public string OutTradeNo { get; set; }

        /// <summary>
        /// 商户转账唯一订单号 定义的转账单据ID
        /// </summary> 
        public string OutBizNo { get; set; }
        /// <summary>
        ///收款方账户类型 
        ///1、ALIPAY_USERID：支付宝账号对应的支付宝唯一用户号
        ///2、ALIPAY_LOGONID：支付宝登录号
        /// </summary> 
        public string PayeeType { get; set; }
        /// <summary>
        ///转账金额，单位：元。 
        /// </summary> 
        public string Amount { get; set; }
        /// <summary>
        /// 收款方账户。与payee_type配合使用。
        /// </summary> 
        public string PayeeAccount { get; set; }
        /// <summary>
        /// 手机App支付：是/扫码支付：是/退款：无
        /// 11
        /// 订单总金额，单位为元，精确到小数点后两位，取值范围为 [0.01,100000000]，金额不能为 0。
        /// 如果同时传入了【可打折金额】，【不可打折金额】，【订单总金额】三者，则必须满足如下条件：【订单总金额】=【可打折金额】+【不可打折金额】
        /// </summary> 
        public string TotalAmount { get; set; }
        /// <summary>
        /// 可选
        /// 11
        /// 可打折金额。参与优惠计算的金额，单位为元，精确到小数点后两位，取值范围为 [0.01,100000000]。
        /// 如果该值未传入，但传入了【订单总金额】和【不可打折金额】，则该值默认为【订单总金额】-【不可打折金额】
        /// </summary>
        public string DiscountableAmount { get; set; }
        /// <summary>
        /// 手机App支付：无/扫码支付：无/退款：是
        /// 9
        /// 订单总金额，单位为元，精确到小数点后两位，取值范围[0.01, 100000000]
        /// </summary> 
        public string RefundAmount { get; set; }
        /// <summary>
        /// 值为authorization_code时，代表用code换取；值为refresh_token时，代表用refresh_token换取
        /// </summary> 
        public string GrantType { get; set; }
        /// <summary>
        /// 授权码，用户对应用授权后得到。
        /// </summary> 
        public string Code { get; set; }
        /// <summary>
        /// 手机App支付：是/扫码支付：无/退款：无
        /// 64
        /// 销售产品码，商家和支付宝签约的产品码，为固定值QUICK_MSECURITY_PAY
        /// </summary> 
        public string ProductCode { get; set; }

        /// <summary>
        /// 手机App支付：否/扫码支付：否/退款：无
        /// 6
        /// 设置未付款支付宝交易的超时时间，一旦超时，该笔交易就会自动被关闭。当用户进入支付宝收银台页面（不包括登录页面），会触发即刻创建支付宝交易，此时开始计时。取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。 该参数数值不接受小数点， 如 1.5h，可转换为 90m。
        /// </summary> 
        public string TimeoutExpress { get; set; }
        /// <summary>
        /// 支付宝交易号
        /// </summary> 
        public string TradeNo { get; set; }

        /// <summary>
        /// 账单类型
        /// 账单类型，商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型：
        /// trade、signcustomer；trade指商户基于支付宝交易收单的业务账单；signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单。
        /// </summary> 
        public string BillType { get; set; }
        /// <summary>
        /// 账单时间
        /// 2016-04-05
        /// 账单时间：日账单格式为yyyy-MM-dd，最早可下载2016年1月1日开始的日账单；月账单格式为yyyy-MM，最早可下载2016年1月开始的月账单。
        /// </summary> 
        public string BillDate { get; set; }

        /// <summary>
        /// 标识一次退款请求，同一笔交易多次退款需要保证唯一，如需部分退款，则此参数必传。
        /// </summary>
        public string OutRequestNo { get; set; }

        /// <summary>
        /// 否
        /// 128
        /// 对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
        /// </summary>
        public string Body { get; set; }

        /// <summary>
        /// 否
        /// 16
        /// 卖家支付宝用户 ID。 如果该值为空，则默认为商户签约账号对应的支付宝用户 ID。不允许收款账号与付款方账号相同
        /// </summary>
        public string SellerId { get; set; }
        
        ///// <summary>
        ///// 否
        ///// 2
        ///// 商品主类型：0—虚拟类商品，1—实物类商品
        ///// 注：虚拟类商品不支持使用花呗渠道
        ///// </summary>
        //public string GoodsType { get; set; }

        ///// <summary>
        ///// 否
        ///// 512
        ///// 公用回传参数，如果请求时传递了该参数，则返回给商户时会回传该参数。支付宝会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝
        ///// </summary>
        //public string PassbackParams { get; set; }

        ///// <summary>
        ///// 否
        ///// 512
        ///// 优惠参数
        ///// 注：仅与支付宝协商后可用
        ///// </summary>
        //public string PromoParams { get; set; }

        ///// <summary>
        ///// 否
        ///// 业务扩展参数，详见下面的“业务扩展参数说明”
        ///// </summary>
        //public string ExtendParams { get; set; }

        ///// <summary>
        ///// 否
        ///// 128
        ///// 可用渠道，用户只能在指定渠道范围内支付
        ///// 当有多个渠道时用“,”分隔
        ///// 注：与disable_pay_channels互斥
        ///// </summary>
        //public string EnablePayChannels { get; set; }

        ///// <summary>
        ///// 否
        ///// 128
        ///// 禁用渠道，用户不可用指定渠道支付
        ///// 当有多个渠道时用“,”分隔
        ///// 注：与enable_pay_channels互斥
        ///// </summary>
        //public string DisablePayChannels { get; set; }

        ///// <summary>
        ///// 否
        ///// 32
        ///// 商户门店编号
        ///// </summary>
        //public string StoreId { get; set; }
    }
}
